查看原文
其他

群落分析中常见的数据转化方法

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08
群落分析中常见的数据转化方法

在数据分析中,我们有时会在分析前首先对数据作一些转化,并使用转化后的数据而非原始测量数据进行更进一步的统计分析。那么,为什么要对数据作转化呢,有什么必要呢,或者转化后的数据会对我们的分析带来怎样的便利或帮助呢?下文作个简介。

本篇以生态学中的数据处理为背景作阐述。因为白鱼同学读研那会儿主要接触的16S高通量测序数据,说白了就是土壤细菌群落分析。群落嘛,无论是物种数据还是环境数据,大类上归属于生态学的范畴了。所以,您若也接触的群落相关的研究,本篇或许会有帮助。

 

数据转化


在某些特定的分析中,规定了数据的结构,而我们的原始数据可能并不符合,需要首先执行相应的转化后才行。或者有些情况下,我们直接使用原始测量数据的分析结果可能并不理想,这时候不妨对原始数据进行某种转化试试,也许会发现先前被忽视的结论。

数据转化会改变各个值之间的相对差异,从而改变它们的分布。数据转化的方法有很多,各方法适用的情形也有不同。生态学中常见的数据转化方法、原理、公式等描述可参阅Legendre和Legendre(1998)“Numerical Ecology”,33-47页的内容。

 

简单的数据转换


简单的数据转换方法可大致分为两类:线性转换,对原始数据中的每个值加常数或乘以常数,通常不会改变统计检验的结果;非线性转换,如对数转换,平方根转换等,转换后的统计检验结果与未转换的变量的统计检验结果会有不同。无论怎样转换数据,对每个变量的值均进行了同一种转换模式,各变量之间独立互不影响。

 

对于生态学数据来讲,对数据进行简单的转换的目的主要有这么几点:

(1)改变数据的结构,使其能更好地反映生态关系。例如使本来不具备线性关系两种变量转换为线性关系,因为线性关系通常比非线性关系更容易解释。

(2)为了更好地适合某些特殊分析方法。例如T检验要求数据近似正态分布,而我们的数据并非如此(生态学的数据普遍是非正态分布,这点大家深有体会吧),若执行T检验则必须首先将数据转换为正态分布类型。如在某些情况下可使用log转换实现这一需求。

(3)缩小属性间的差异性,使数据值趋向一致,便于数据观测和统计等。

切记数据转换过程不是盲目的,在转换数据时,我们需要确保转换后的数据分布不会变得更糟,并且避免出现异常值。如果我们结论是根据转换后的数据得出的,那么必须要在结论中(图注、表注部分等,或者在方法描述部分)清楚地说明这一点。还有重要的一点肯定就是要注意所得的结论是否合理了(是否具有生态学意义,还是仅仅为数学计算上的偶然性),假设你得到了变量“太阳辐射和风速的3次方存在相关性”类似的结论,解释起来就要小心。

 

这是一个非常有意思的图,向我们展示了几种常见的数据转换前后的变化。图片中不同形状的猪分别代表了多种样式的数据分布情况,这里可将中间的“正常猪”视为一种理想状态下的数据分布类型,其余位置的“非正常猪”代表了数据分布不均匀或者存在一些极端值的情况,“非正常猪”可通过图示的转换方式获得“正常猪”类型。


有些蒙圈,没看明白图的意思?把数据分布状态和猪形状组合在一起说明,就是下图这么回事,还是很容易理解的。比方说下图左图,原始数据集中分布在低值区域,呈现为“左倾斜”样式,可通过log转化为正态分布样式。


 

那么,就再通过一个形象的例子,阐述下数据转化对我们数据分析可能存在的重要性吧。

回到上面那张“猪形状转换矩阵图”,以右下角的猪为例,看不到头也看不到脚,后半身比例过长且上背部拱起。形象地反映出测量数据中,出现了少数很大的值偏离了整体平均分布范围,数据的绝大多数数值对应着较小的值,集中在左侧很窄的区间内,此时很难在图中呈现出。以物种丰度数据为例,通常体现在少数物种具有很高的丰度,而更多的物种处于较低丰度,高丰度和低丰度物种之间往往差了好几个数量级。因此,若我们实际的数据分布状态更像右下角的猪,而且也不能选择将出现的较大值剔除的话,那么可以不妨尝试分别对x和y变量执行log(x)、log(y)转换,观察转换后的数据与先前相比是否更利于我们观测、统计,以及得到了在先前被忽视的潜在结论等。若真的可行,那么也不失为一种更合理有效的方法。如下图所示的这样。


图注:栖息地面积与物种个体数量的关系,左图基于原始数据分布绘制,右图基于log转换(分别对x、y变量执行log转换)后的数据绘制。根据转换后的数据,我们很轻易地看出两个变量间存在明显的线性关系,并可据此推断回归方程log(y)=a*log(x)+b;而在原始数据中,我们是很难发现二者之间这种潜在的线性关系的(很容易被忽视)。

 

在R中,这些简单的数据转换方法完全可以根据公式直接书写命令执行转换了。例如对物种变量矩阵X执行log10转换,可以直接写成“X <- log10(X+1)”或者“X <- log(X+1, 10)”,+1是为了避免0值无法取对数的情况;平方根转换,“X <- X^0.5”或者“X <- sqrt(X)”;等等。

#简单的数据转换直接按数学公式来即可,如
dat <- log(data+1, 2)    #log2
dat <- log(data+1, exp(1)) #ln
dat <- log(data+1, 10) #log10
 
dat <- data^2 #平方
dat <- data^0.5 #开方
dat <- data^-1 #倒数

 

数据标准化


数据标准化是统计学上常用的方法,它从来自数据本身计算的统计量来更改数据(例如均值、范围、权重等)。虽然标准化过程也是通过某一计算将原始数据变成新的值,但它与原始数据集合中的其他值有关,因此不同于上述简单的数据转换(对各变量统一执行同一变换,变量间互不影响)。

常见的数据标准化方法如中心化(centralization),将原始数据减去平均值;标准化(normalization),转换后的数据均值为0,方差为1;z-scores标准化,也称标尺化(scaling),先中心化后再除以标准差;等等方法。

 

对于生态学数据来讲,应用标准化的最常见原因主要是为了:

(1)改变变量或对象的相对权重(重要性),消除这种由相对权重所造成的差异。

(2)当变量具有不同的量纲时,标准化过程可以使不同物理单位的变量具有可比性。

(3)缩小变量间的差异,降低极端值的影响,或者限制数据的取值范围(如[0,1]区间)等。

同样地,是否需要将数据标准化,选择何种标准化方法等,需要根据实际情况来确定,不可盲目。举个例子,在RNA-seq中(有些偏题了,不过没关系,仅用它展示个可能的反例),有种方法叫FPKM,用于对reads count值实现标准化;实验室的师妹使用FPKM标准化16S群落测序的OTU数据……总觉得有种滥用的感觉……

其它一些注意事项参考上文所述。

 

我们以PCA为例简要说明数据标准化在特定分析中的重要性。

当我们使用环境数据执行PCA时,不同的环境变量之间的量纲通常是不一样的(例如pH、温度、湿度等,具有不同的衡量单位),直接进行排序很容易产生较大的方差(且参差不齐);因此需要在排序前对环境数据标准化处理,使它们具有相同的量纲,基于变量标准化后的协方差矩阵(相关系数矩阵)运行PCA。

而对于物种丰度数据而言,更不建议直接使用原始的物种数据执行PCA。归因于PCA本质上以欧几里得距离为基础,在物种数据的分析中无法很好地处理双零问题,且几里得距离还具有对“物种丰度的差异”比对“物种是否存在”更加敏感的属性,如果原始物种数据中包含很多0值,那么情况将会很糟糕。生态学家普遍建议通过对物种数据执行Hellinger标准化,使物种数据能够适用到PCA中。(见“常见群落距离测度”)

 

在R中,很多特定分析方法的命令中通常会提供标准化参数,我们在执行这些分析时可根据自己的需要决定是否对数据执行标准化处理。例如,就对上述PCA而言,vegan包中执行PCA、RDA排序的函数rda(),通过指定参数scale=TRUE/FALSE以确定是否在分析前首先对数据标准化。其它情况下,对于没有明确要求需要首先标准化数据的分析方法,若我们想自己添加一些特定的标准化处理也是可行的(根据实际情况决定,不要使得数据在标准化后反而更加糟糕)。例如,vegan包中decostand()函数提供了多种生态学数据常用的标准化方法,此外还有其它的各种R包等等。

#一些特定分析方法的命令中通常会提供标准化参数
#例如,vegan 包的 PCA/RDA 函数 rda(),通过 scale 参数指定
rda(dat, scale = TRUE) #执行变量标准化
rda(dat, scale = FALSE) #不执行变量标准化

#多种函数可提供数据标准化功能
#例如,vegan包 decostand() 函数的数据标准化方法
dat2 <- decostand(dat, method = 'pa') #二元 0-1 转化
dat2 <- decostand(dat, method = 'normalize') #转化后平方和为 1
dat2 <- decostand(dat, method = 'hellinger') #Hellinger 转化
dat2 <- decostand(dat, method = 'chi.square') #卡方转化

 

二元转换


此外,有时候我们还会出于某种需要,根据数值的有-无转化为1-0类型的二元数据,即将定量变量转换为定性变量。例如,在探索某些物种的出现与否与当前环境的关系等,只关注物种有无,不关注物种的确切数量(或丰度)。

 

在R中,二元1-0转化的方法就非常简单了。

#例如,vegan包 decostand() 二元 0-1 转化
dat2 <- decostand(dat, method = 'pa')

#或者直接使用
dat[dat>0] <- 1
  

参考资料


张金屯. 数量生态学. 科学出版社, 2004.

David Zelený博士:https://www.davidzeleny.net/anadat-r/doku.php/en:data_preparation

Legendre P, Legendre L. Numerical Ecology. Second English edition. Developments in Environmental Modelling, 1998, 20, Elsevier



链接

常见的群落相似性或距离测度的计算

群落Beta多样性分析与群落相似性简介

R语言绘制群落物种累积曲线

R语言绘制物种Rank-abundance曲线

R语言绘制物种稀释曲线及其它多种Alpha多样性曲线

R语言计算群落多样性分析中常见Alpha多样性指数

群落多样性分析中常见Alpha多样性指数简介

R语言绘制三元图(Ternary Plot)示例

突破韦恩图数量限制,R包UpSetR集合可视化

R包circlize绘制弦状图示例

R语言绘制曼哈顿图示例

R语言绘制差异火山图示例



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存